package FredyCRUD;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 * Clase para mostrar el listado de tablas de la BD
 * @author JF
 */
public class ListaTablas extends javax.swing.JFrame {
    private Conexion mySQLBD;                   // Objeto de conexión
    private String nombreBD;                    // Nombre de la base de datos
    
    private DatabaseMetaData metaDatos; // metadatos de la BD
    private ResultSet resultado;        // resultado de la ejecución de la sentencia a la BD
    
    /**
     * Constructor forma Listar tablas
     * @param mySQLBD Objeto de conexión
     * @param nombreBD Base de datos escogida
     */
    public ListaTablas(Conexion mySQLBD, String nombreBD) {
        this.mySQLBD = mySQLBD;                     // Parámetros conexión BD
        this.nombreBD = nombreBD;                   // Nombre de la BD escogida
        
        initComponents();                           // Inicia la forma
        if (this.mySQLBD.conectar(nombreBD)) {      // Conexión a la BD
            if (this.mySQLBD.consultarTablas()) {   // Consulta de tablas
                mostrarTablas();                    // Muestra la lista de tablas
                if (lisTablas.getVisibleRowCount() > 0) {   // Existen tablas?
                    lisTablas.setSelectedIndex(0);  // Seleccione la primer tabla
                }
            }
        }
    }

    /**
     * Crea nueva forma de ListaTablas (constructor por defecto)
     */
    public ListaTablas() {
        initComponents();                           // Iniciliza la forma
    }

    /**
     * Inicia la forma
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        lisTablas = new javax.swing.JList();
        labTablas = new javax.swing.JLabel();
        scrCampos = new javax.swing.JScrollPane();
        tabCampos = new javax.swing.JTable();
        botGenerar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("FredyCRUD: Tablas de la BD");

        lisTablas.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        lisTablas.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                lisTablasValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(lisTablas);

        labTablas.setText("Tablas");

        tabCampos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Campo", "Tipo", "Listar", "Editar"
            }
        ));
        scrCampos.setViewportView(tabCampos);

        botGenerar.setText("Generar Aplicación");
        botGenerar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botGenerarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(labTablas)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(botGenerar))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(scrCampos, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(labTablas)
                    .addComponent(botGenerar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(scrCampos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addComponent(jScrollPane1))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Selección de un elemento de la lista de tablas
     * @param evt Evento de la selección
     */
    private void lisTablasValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_lisTablasValueChanged
        mostrarCampos();                            // Muestra los campos de las tablas
    }//GEN-LAST:event_lisTablasValueChanged

    /**
     * Genera el código fuente de la nueva aplicación
     * @param evt Evento del botón de generar
     */
    private void botGenerarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botGenerarActionPerformed
        creaEstructuraDirectorios();                // Crea la estructura de carpetas de la aplicación
        for (int i = 0; i < lisTablas.getModel().getSize(); i++) {  // Recorre las tablas
            creaArchivoSrcJava(lisTablas.getModel().getElementAt(i).toString());
        }
        JOptionPane.showMessageDialog(null, "Aplicación Generada!");
    }//GEN-LAST:event_botGenerarActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ListaTablas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ListaTablas().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botGenerar;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel labTablas;
    private javax.swing.JList lisTablas;
    private javax.swing.JScrollPane scrCampos;
    private javax.swing.JTable tabCampos;
    // End of variables declaration//GEN-END:variables

    /**
     * Muestra en la lista la relación de tablas de una BD
     */
    private void mostrarTablas() {
        DefaultListModel modeloLista = new DefaultListModel();
        modeloLista.removeAllElements();            // Limpia la lista
        
        try {
            while (mySQLBD.getResultado().next()) { // Recorre las tablas de la BD
                modeloLista.addElement(mySQLBD.getResultado().getString("TABLE_NAME"));
            }
            lisTablas.setModel(modeloLista);        // Asigna el nuevo modelo
        } catch (SQLException ex) {                 // Error listado de tablas
            JOptionPane.showMessageDialog(null, 
                    "Error!, ninguna tabla encontrada, \n[" + ex.getMessage() + "]");
        }
    }

    /**
     * Mostrar los campos de una tabla seleccionada
     */
    private void mostrarCampos() {
        if (lisTablas.getSelectedValue() != null) {     // Existen tablas?
            String nombreTabla = lisTablas.getSelectedValue().toString();
            
            try {
                DefaultTableModel modeloTabla = (DefaultTableModel)tabCampos.getModel();
                while (modeloTabla.getRowCount() > 0) { // Limpiar tabla
                    modeloTabla.removeRow(0);           // Eliminar por filas
                }

                // Recorre los campos de la tabla
                this.mySQLBD.setResultado(this.mySQLBD.getMetaDatos()
                        .getColumns(null, null, nombreTabla, null));
                while (this.mySQLBD.getResultado().next()) {
                    modeloTabla.addRow(new Object[] {
                        this.mySQLBD.getResultado().getString("COLUMN_NAME"), "", "", ""});
                }
                tabCampos.setModel(modeloTabla);        // Actualiza la forma
            } catch (SQLException ex) {                 // Error al obtener los campos
                JOptionPane.showMessageDialog(null, 
                        "Error!, no es posible obtener los campos de la tabla, "
                        + nombreTabla + "\n[" + ex.getMessage() + "]");
            }            
        }
    }

    /**
     * Pregunta y si no existe el directorio lo crea
     * @param ruta Directorio a examinar y si es el caso, a crear
     */
    private void creaDirectorio(String ruta) {
        if (System.getProperty("os.name").toString().toUpperCase().startsWith("WINDOWS")) {
            ruta.replace("/", "\\");                // Crea directorio de acuerdo al SO
        }
        File carpeta = new File(ruta);
        if (!carpeta.exists()) {                    // La carpeta no existe?
            carpeta.mkdirs();                       // Crea la carpeta
        }
    }

    /**
     * Crea estructura de directorios del proyecto tipo Netbeans
     */
    private void creaEstructuraDirectorios() {
        creaDirectorio(this.nombreBD);                  // Carpeta raíz de la aplicación
        creaDirectorio(this.nombreBD + "/build");       // Subcarpeta de construcción
        creaDirectorio(this.nombreBD + "/build/classes");
        creaDirectorio(this.nombreBD + "/build/classes/" + this.nombreBD);
        creaDirectorio(this.nombreBD + "/nbproject");   // Subcarpeta del proyecto tipo Netbeans
        creaDirectorio(this.nombreBD + "/nbproject/private");
        creaDirectorio(this.nombreBD + "/src");         // Subcarpeta de fuentes
        creaDirectorio(this.nombreBD + "/src/" + this.nombreBD);
    }

    /**
     * Crea el archivo fuente .java
     * @param nombreArchivo Nombre del archivo a crear
     */
    private void creaArchivoSrcJava(String nombreTabla) {
        String cadena = this.nombreBD + "/src/" + this.nombreBD 
                + "/" + nombreTabla + ".java";  // Archivo a crear
        
        if (System.getProperty("os.name").toString().toUpperCase().startsWith("WINDOWS")) {
            cadena.replace("/", "\\");          // Verifica SO
        }
        
        File archivo = new File(cadena);        // Manejador de archivos        
        try (BufferedWriter buffer = new BufferedWriter(new FileWriter(archivo))) {
            String nombreClase = nombreTabla.toUpperCase().charAt(0) 
                    + nombreTabla.substring(1);
            try {                               // Obtiene los campos de la tabla
                this.mySQLBD.setResultado(this.mySQLBD.getMetaDatos()
                        .getColumns(null, null, nombreTabla, null));
            } catch (SQLException ex) {
            }

            // Encabezado: paquete, imports swing, autor
            buffer.write("package " + this.nombreBD + ";\n\n");
            buffer.write("import java.sql.*;\n");
            buffer.write("import javax.swing.JOptionPane;\n\n");
            buffer.write("/**\n *\n * @author FredyCRUD\n */\n\n");

            // Definición de la clase
            buffer.write("public class " + nombreClase + " extends javax.swing.JFrame {\n");
            
            // Atributos de la clase para la conexión
            buffer.write("\tConnection conexion;\n");
            buffer.write("\tStatement sentencia;\n");
            buffer.write("\tResultSet resultado;\n");
            buffer.write("\tboolean ingresar = true;\n\n");
            
            // Constructor por defecto de la clase
            buffer.write("\t/**\n\t * Crea nueva forma de " + nombreTabla + "\n\t */\n");
            buffer.write("\tpublic " + nombreClase + "() {\n");
            buffer.write("\t\tinitComponents();\n");
            buffer.write("\t\tconexionBD();\n");
            buffer.write("\t\tconsultar" + nombreClase + "();\n");
            buffer.write("\t\tmostrar" + nombreClase + "();\n");
            buffer.write("\t}\n\n");
            
            // Método InitComponents
            buffer.write("\t/**\n\t * Inicializa la forma \n\t */\n");
            buffer.write("\t@SuppressWarnings(\"unchecked\")\n");
            buffer.write("\t// <editor-fold defaultstate=\"collapsed\" " 
                    + "desc=\"Generated Code\">\n");
            buffer.write("\tprivate void initComponents() {\n");

            // Instanciar los objetos gráficos de la interfaz de la tabla de datos
            try {
                while (this.mySQLBD.getResultado().next()) {    // Recorre los campos
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    buffer.write("\t\tlab" + nombreCampo + " = new javax.swing.JLabel();\n");
                    buffer.write("\t\tlab" + nombreCampo + ".setText(\"" + nombreCampo + "\");\n");
                    buffer.write("\t\ttxt" + nombreCampo + " = new javax.swing.JTextField();\n");
                }
            } catch (SQLException ex) {
            }
            
            // Instanciar los botones de navegación y acción de datos
            buffer.write("\t\tbotPrimero = new javax.swing.JButton();\n");
            buffer.write("\t\tbotAnterior = new javax.swing.JButton();\n");
            buffer.write("\t\tbotSiguiente = new javax.swing.JButton();\n");
            buffer.write("\t\tbotUltimo = new javax.swing.JButton();\n");
            buffer.write("\t\tbotBuscar = new javax.swing.JButton();\n");
            buffer.write("\t\tbotNuevo = new javax.swing.JButton();\n");
            buffer.write("\t\tbotModificar = new javax.swing.JButton();\n");
            buffer.write("\t\tbotBorrar = new javax.swing.JButton();\n\n");
            
            // Programar botón de salir, programar título de la interfaz
            buffer.write("\t\tsetDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);\n");
            buffer.write("\t\tsetTitle(\"" + nombreClase + "\");\n\n");
            
            // Botón primer registro
            buffer.write("\t\tbotPrimero.setText(\"|<\");\n");
            buffer.write("\t\tbotPrimero.addActionListener(new java.awt.event.ActionListener() {\n");
            buffer.write("\t\t\tpublic void actionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\t\t\tbotPrimeroActionPerformed(evt);\n");
            buffer.write("\t\t\t}\n\t\t});\n\n");
            
            // Botón registro anterior
            buffer.write("\t\tbotAnterior.setText(\"<\");\n");
            buffer.write("\t\tbotAnterior.addActionListener(new java.awt.event.ActionListener() {\n");
            buffer.write("\t\t\tpublic void actionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\t\t\tbotAnteriorActionPerformed(evt);\n");
            buffer.write("\t\t\t}\n\t\t});\n\n");
            
            // Botón registro siguiente
            buffer.write("\t\tbotSiguiente.setText(\">\");\n");
            buffer.write("\t\tbotSiguiente.addActionListener(new java.awt.event.ActionListener() {\n");
            buffer.write("\t\t\tpublic void actionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\t\t\tbotSiguienteActionPerformed(evt);\n");
            buffer.write("\t\t\t}\n\t\t});\n\n");
            
            // Botón último registro
            buffer.write("\t\tbotUltimo.setText(\">|\");\n");
            buffer.write("\t\tbotUltimo.addActionListener(new java.awt.event.ActionListener() {\n");
            buffer.write("\t\t\tpublic void actionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\t\t\tbotUltimoActionPerformed(evt);\n");
            buffer.write("\t\t\t}\n\t\t});\n\n");
            
            // Botón buscar registros
            buffer.write("\t\tbotBuscar.setText(\"Buscar\");\n");
            buffer.write("\t\tbotBuscar.addActionListener(new java.awt.event.ActionListener() {\n");
            buffer.write("\t\t\tpublic void actionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\t\t\tbotBuscarActionPerformed(evt);\n");
            buffer.write("\t\t\t}\n\t\t});\n\n");
            
            // Botón crear registro
            buffer.write("\t\tbotNuevo.setText(\"Nuevo\");\n");
            buffer.write("\t\tbotNuevo.addActionListener(new java.awt.event.ActionListener() {\n");
            buffer.write("\t\t\tpublic void actionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\t\t\tbotNuevoActionPerformed(evt);\n");
            buffer.write("\t\t\t}\n\t\t});\n\n");
            
            // Botón actualizar registros
            buffer.write("\t\tbotModificar.setText(\"Modificar\");\n");
            buffer.write("\t\tbotModificar.addActionListener(new java.awt.event.ActionListener() {\n");
            buffer.write("\t\t\tpublic void actionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\t\t\tbotModificarActionPerformed(evt);\n");
            buffer.write("\t\t\t}\n\t\t});\n\n");
            
            // Botón eliminar un registro
            buffer.write("\t\tbotBorrar.setText(\"Borrar\");\n");
            buffer.write("\t\tbotBorrar.addActionListener(new java.awt.event.ActionListener() {\n");
            buffer.write("\t\t\tpublic void actionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\t\t\tbotBorrarActionPerformed(evt);\n");
            buffer.write("\t\t\t}\n\t\t});\n\n");
            
            // Programación de los layouts
            buffer.write("\t\tjavax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());\n");
            buffer.write("\t\tgetContentPane().setLayout(layout);\n");
            
            // Horizontal
            buffer.write("\t\tlayout.setHorizontalGroup(\n");
            buffer.write("\t\t\tlayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n");
            buffer.write("\t\t\t.addGroup(layout.createSequentialGroup()\n");
            buffer.write("\t\t\t\t.addGap(34, 34, 34)\n");
            buffer.write("\t\t\t\t.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n");
            buffer.write("\t\t\t\t\t.addGroup(layout.createSequentialGroup()\n");
            buffer.write("\t\t\t\t\t\t.addComponent(botPrimero)\n");
            buffer.write("\t\t\t\t\t\t.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n");
            buffer.write("\t\t\t\t\t\t.addComponent(botAnterior)\n");
            buffer.write("\t\t\t\t\t\t.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n");
            buffer.write("\t\t\t\t\t\t.addComponent(botSiguiente)\n");
            buffer.write("\t\t\t\t\t\t.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n");
            buffer.write("\t\t\t\t\t\t.addComponent(botUltimo)\n");
            buffer.write("\t\t\t\t\t\t.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n");
            buffer.write("\t\t\t\t\t\t.addComponent(botBuscar))\n");
            buffer.write("\t\t\t\t\t.addGroup(layout.createSequentialGroup()\n");
            buffer.write("\t\t\t\t\t\t.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)");
            
            // Adiciona los componentes de la tabla de datos
            try {
                this.mySQLBD.getResultado().first();
                do {
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    buffer.write("\n\t\t\t\t\t\t\t.addComponent(lab" + nombreCampo + ")");
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }
            
            buffer.write(")\n");
            buffer.write("\t\t\t\t\t\t.addGap(6, 6, 6)\n");
            buffer.write("\t\t\t\t\t\t.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)");
            
            try {
                this.mySQLBD.getResultado().first();
                do {
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    buffer.write("\n\t\t\t\t\t\t\t.addComponent(txt" + nombreCampo + " ,javax.swing.GroupLayout.PREFERRED_SIZE, 219, javax.swing.GroupLayout.PREFERRED_SIZE)");
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }
            buffer.write(")\n");
            
            // Componentes de los botones de navegación y acción de datos
            buffer.write("\t\t\t\t\t\t.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 43, Short.MAX_VALUE)\n");
            buffer.write("\t\t\t\t\t\t.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)\n");
            buffer.write("\t\t\t\t\t\t\t.addComponent(botModificar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n");
            buffer.write("\t\t\t\t\t\t\t.addComponent(botBorrar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)\n");
            buffer.write("\t\t\t\t\t\t\t.addComponent(botNuevo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))\n");
            buffer.write("\t\t\t\t.addContainerGap(24, javax.swing.GroupLayout.PREFERRED_SIZE))\n");
            buffer.write("\t\t\t);\n");
            
            // Vertical
            buffer.write("\t\t\tlayout.setVerticalGroup(\n");
            buffer.write("\t\t\t\tlayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n");
            buffer.write("\t\t\t\t.addGroup(layout.createSequentialGroup()\n");
            buffer.write("\t\t\t\t\t.addGap(33, 33, 33)\n");
            buffer.write("\t\t\t\t\t.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n");
            
            try {
                this.mySQLBD.getResultado().first();
                String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                buffer.write("\t\t\t\t\t\t.addComponent(lab" + nombreCampo + ")\n");
                buffer.write("\t\t\t\t\t\t.addComponent(txt" + nombreCampo +
                        ", javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)\n");
                buffer.write("\t\t\t\t\t\t.addComponent(botNuevo))\n");
                buffer.write("\t\t\t\t\t.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)\n");
                buffer.write("\t\t\t\t\t\t.addGroup(layout.createSequentialGroup()\n");
                buffer.write("\t\t\t\t\t\t\t.addGap(18, 18, 18)\n");
                buffer.write("\t\t\t\t\t\t\t.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n");
                
                if (this.mySQLBD.getResultado().next()) {
                    nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    buffer.write("\t\t\t\t\t\t\t\t.addComponent(lab" + nombreCampo + ")\n");
                    buffer.write("\t\t\t\t\t\t\t\t.addComponent(txt" + nombreCampo + 
                            ", javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))\n");
                }
                
                buffer.write("\t\t\t\t\t\t\t.addGap(62, 62, 62)\n");
                buffer.write("\t\t\t\t\t\t\t.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)\n");
                buffer.write("\t\t\t\t\t\t\t\t.addComponent(botPrimero)\n");
                buffer.write("\t\t\t\t\t\t\t\t.addComponent(botAnterior)\n");
                buffer.write("\t\t\t\t\t\t\t\t.addComponent(botSiguiente)\n");
                buffer.write("\t\t\t\t\t\t\t\t.addComponent(botUltimo)\n");
                buffer.write("\t\t\t\t\t\t\t\t.addComponent(botBuscar)))\n");
                buffer.write("\t\t\t\t\t\t.addGroup(layout.createSequentialGroup()\n");
                //buffer.write("\t\t\t\t\t\t\t.addGap(5, 5, 5)\n");
                //buffer.write("\t\t\t\t\t\t\t.addComponent(botGuardar)\n");
                buffer.write("\t\t\t\t\t\t\t.addGap(18, 18, 18)\n");
                buffer.write("\t\t\t\t\t\t\t.addComponent(botModificar)\n");
                buffer.write("\t\t\t\t\t\t\t.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)\n");
                buffer.write("\t\t\t\t\t\t\t.addComponent(botBorrar)))\n");
                buffer.write("\t\t\t\t\t.addContainerGap(21, Short.MAX_VALUE))\n");
                buffer.write("\t\t\t);\n\n");
                
                
                buffer.write("\t\t\tpack();\n");
                buffer.write("\t}// </editor-fold>                           \n");
            } catch (SQLException ex) {
            }
            // fin del método initComponents
            
            // Método para programar el botón de nuevo registro
            buffer.write("\n\n\tprivate void botNuevoActionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\tif (ingresar) {   // Se va a ingresar un nuevo registro\n");
            buffer.write("\t\t\tbotNuevo.setText(\"Guardar\");\n");
            buffer.write("\t\t\tingresar = false;\n\n");
            buffer.write("\t\t\t//Desactivar botones\n");
            buffer.write("\t\t\tbotModificar.setEnabled(false);\n");
            buffer.write("\t\t\tbotBorrar.setEnabled(false);\n");
            buffer.write("\t\t\tbotPrimero.setEnabled(false);\n");
            buffer.write("\t\t\tbotAnterior.setEnabled(false);\n");
            buffer.write("\t\t\tbotSiguiente.setEnabled(false);\n");
            buffer.write("\t\t\tbotUltimo.setEnabled(false);\n");
            buffer.write("\t\t\tbotBuscar.setEnabled(false);\n");

            try {
                this.mySQLBD.getResultado().first();
                do {
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    buffer.write("\n\t\t\ttxt" + nombreCampo + ".setText(\"\");");
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }

            buffer.write("\n\t\t}\n");
            buffer.write("\t\telse {    // Se van a guardar los cambios\n");

            try {
                this.mySQLBD.getResultado().first();
                do {
                    String tipoCampo = this.mySQLBD.getResultado().getString("TYPE_NAME");
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    String tipoDato = "", tipoDatoMay = "";
                    
                    switch(tipoCampo) {
                        case ("INT") : { tipoDato = "long"; tipoDatoMay = "Long"; } break;
                        case ("VARCHAR") : { tipoDato = "String"; tipoDatoMay = "String"; } break;
                    }
                    
                    if (tipoDato.equals("String")) {
                        buffer.write("\t\t\t" + tipoDato + " " + nombreCampo
                            + " = txt" + nombreCampo + ".getText();\n");
                    }
                    else {
                        buffer.write("\t\t\t" + tipoDato + " " + nombreCampo + " = "
                            + tipoDatoMay + ".parse" + tipoDatoMay + "(txt" + nombreCampo
                            + ".getText());\n");
                    }
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }
            
            buffer.write("\n\t\t\ttry {\n");
            buffer.write("\t\t\t\tresultado.moveToInsertRow();\n");
            
            try {
                this.mySQLBD.getResultado().first();
                do {
                    String tipoCampo = this.mySQLBD.getResultado().getString("TYPE_NAME");
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    String tipoDatoMay = "";
                    
                    switch(tipoCampo) {
                        case ("INT") : { tipoDatoMay = "Long"; } break;
                        case ("VARCHAR") : { tipoDatoMay = "String"; } break;
                    }
                    
                    buffer.write("\t\t\t\tresultado.update" + tipoDatoMay + "(\"" 
                            + nombreCampo + "\", " + nombreCampo + ");\n");
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }
            
            buffer.write("\t\t\t\tresultado.insertRow();\n\n");
            buffer.write("\t\t\t\tresultado.close();\n");
            buffer.write("\t\t\t\tsentencia.close();\n\n");
            buffer.write("\t\t\t\tconsultar" + nombreClase + "();\n");
            buffer.write("\t\t\t\tmostrar" + nombreClase + "();\n\n");
            buffer.write("\t\t\t\tJOptionPane.showMessageDialog(null, \"Datos agregados!\");\n\n");
            
            buffer.write("\t\t\t\tbotNuevo.setText(\"Nuevo\");\n");
            buffer.write("\t\t\t\tingresar = true;\n\n");
            buffer.write("\t\t\t\t//Activar botones\n");
            buffer.write("\t\t\t\tbotModificar.setEnabled(true);\n");
            buffer.write("\t\t\t\tbotBorrar.setEnabled(true);\n");
            buffer.write("\t\t\t\tbotPrimero.setEnabled(true);\n");
            buffer.write("\t\t\t\tbotAnterior.setEnabled(true);\n");
            buffer.write("\t\t\t\tbotSiguiente.setEnabled(true);\n");
            buffer.write("\t\t\t\tbotUltimo.setEnabled(true);\n");
            buffer.write("\t\t\t\tbotBuscar.setEnabled(true);\n");
            
            buffer.write("\t\t\t} catch (SQLException ex) {\n");
            buffer.write("\t\t\t\tJOptionPane.showMessageDialog(null, \"Error!, al guardar los datos en la bd\");\n");
            buffer.write("\t\t\t}\n");
            
            buffer.write("\t\t}\n\t}\n");
            // Fin método nuevo registro
            
            // Método modificar registro
            buffer.write("\tprivate void botModificarActionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\tif (JOptionPane.showConfirmDialog(null,\n");
            buffer.write("\t\t\t\"Esta seguro de modificar estos datos?\",\n");
            buffer.write("\t\t\t\"Actualizacion de datos de " + nombreClase + "\",\n");
            buffer.write("\t\t\t\"JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {\n");
            
            try {
                this.mySQLBD.getResultado().first();
                do {
                    String tipoCampo = this.mySQLBD.getResultado().getString("TYPE_NAME");
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    String tipoDato = "", tipoDatoMay = "";
                    
                    switch(tipoCampo) {
                        case ("INT") : { tipoDato = "long"; tipoDatoMay = "Long"; } break;
                        case ("VARCHAR") : { tipoDato = "String"; tipoDatoMay = "String"; } break;
                    }
                    
                    if (tipoDato.equals("String")) {
                        buffer.write("\t\t\t" + tipoDato + " " + nombreCampo
                            + " = txt" + nombreCampo + ".getText();\n");
                    }
                    else {
                        buffer.write("\t\t\t" + tipoDato + " " + nombreCampo + " = "
                            + tipoDatoMay + ".parse" + tipoDatoMay + "(txt" + nombreCampo
                            + ".getText());\n");
                    }
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }

            buffer.write("\n\t\t\ttry {\n");

            try {
                this.mySQLBD.getResultado().first();
                do {
                    String tipoCampo = this.mySQLBD.getResultado().getString("TYPE_NAME");
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    String tipoDatoMay = "";
                    
                    switch(tipoCampo) {
                        case ("INT") : { tipoDatoMay = "Long"; } break;
                        case ("VARCHAR") : { tipoDatoMay = "String"; } break;
                    }
                    
                    buffer.write("\t\t\t\tresultado.update" + tipoDatoMay + "(\"" 
                            + nombreCampo + "\", " + nombreCampo + ");\n");
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }
            
            buffer.write("\t\t\t\tresultado.updateRow();\n");
            buffer.write("\t\t\t\tJOptionPane.showMessageDialog(null, \"Datos modificados!\");\n");
            buffer.write("\t\t\t} catch (SQLException ex) {\n");
            buffer.write("\t\t\t\tJOptionPane.showMessageDialog(null, \"Error!, al modificar los datos en la bd\");\n");
            buffer.write("\t\t\t}\n\t\t}\n\t}\n\n");
            // Fin método modificar registro
            
            // Método borrar registros
            buffer.write("\tprivate void botBorrarActionPerformed(java.awt.event.ActionEvent evt) {\n");
            buffer.write("\t\tif (JOptionPane.showConfirmDialog(null,\n");
            buffer.write("\t\t\t\"Esta seguro de modificar estos datos?\",\n");
            buffer.write("\t\t\t\"Actualizacion de datos de " + nombreClase + "\",\n");
            buffer.write("\t\t\t\"JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {\n");
            
            try {
                this.mySQLBD.getResultado().first();
                do {
                    String tipoCampo = this.mySQLBD.getResultado().getString("TYPE_NAME");
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    String tipoDato = "", tipoDatoMay = "";
                    
                    switch(tipoCampo) {
                        case ("INT") : { tipoDato = "long"; tipoDatoMay = "Long"; } break;
                        case ("VARCHAR") : { tipoDato = "String"; tipoDatoMay = "String"; } break;
                    }
                    
                    if (tipoDato.equals("String")) {
                        buffer.write("\t\t\t" + tipoDato + " " + nombreCampo
                            + " = txt" + nombreCampo + ".getText();\n");
                    }
                    else {
                        buffer.write("\t\t\t" + tipoDato + " " + nombreCampo + " = "
                            + tipoDatoMay + ".parse" + tipoDatoMay + "(txt" + nombreCampo
                            + ".getText());\n");
                    }
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }

            buffer.write("\n\t\t\ttry {\n");

            try {
                this.mySQLBD.getResultado().first();
                do {
                    String tipoCampo = this.mySQLBD.getResultado().getString("TYPE_NAME");
                    String nombreCampo = this.mySQLBD.getResultado().getString("COLUMN_NAME");
                    String tipoDatoMay = "";
                    
                    switch(tipoCampo) {
                        case ("INT") : { tipoDatoMay = "Long"; } break;
                        case ("VARCHAR") : { tipoDatoMay = "String"; } break;
                    }
                    
                    buffer.write("\t\t\t\tresultado.update" + tipoDatoMay + "(\"" 
                            + nombreCampo + "\", " + nombreCampo + ");\n");
                } while(this.mySQLBD.getResultado().next());
            } catch (SQLException ex) {
            }
            
            buffer.write("\t\t\t\tresultado.updateRow();\n");
            buffer.write("\t\t\t\tJOptionPane.showMessageDialog(null, \"Datos modificados!\");\n");
            buffer.write("\t\t\t} catch (SQLException ex) {\n");
            buffer.write("\t\t\t\tJOptionPane.showMessageDialog(null, \"Error!, al modificar los datos en la bd\");\n");
            buffer.write("\t\t\t}\n\t\t}\n\t}\n\n");            
            // Fin método modificar registro
            
            buffer.write("}\n");
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, 
                "Error!, no se puede crear el archivo, \n" +
                cadena + "\n[" + ex.getMessage() + "]");
        }
    }
}
